Fix bug #13864 with flickering of TTY frames in an emacslient session.
authorEli Zaretskii <eliz@gnu.org>
Wed, 10 Apr 2013 15:38:20 +0000 (18:38 +0300)
committerEli Zaretskii <eliz@gnu.org>
Wed, 10 Apr 2013 15:38:20 +0000 (18:38 +0300)
 src/frame.c (do_switch_frame): Mark the TTY frame we switch to as
 garbaged only if it is not already the top frame on its TTY.  This
 prevents flickering due to constant redrawing of TTY frames when
 there are GUI frames open in the same session.

src/ChangeLog
src/frame.c

index f4747e5a1010ee5f3d5dfc3ce2233072f0900e36..022f1e245bf2e4c42183fd843444878e55b55f6a 100644 (file)
@@ -1,3 +1,10 @@
+2013-04-10  Eli Zaretskii  <eliz@gnu.org>
+
+       * frame.c (do_switch_frame): Mark the TTY frame we switch to as
+       garbaged only if it is not already the top frame on its TTY.  This
+       prevents flickering due to constant redrawing of TTY frames when
+       there are GUI frames open in the same session.  (Bug#13864)
+
 2013-04-10  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * keyboard.c (timer_start_idle): Call internal-timer-start-idle instead
index 2fe398296ed9453ea090af433ccbff00868048a4..ccd50122f509f15e4cf8223cadc8e05f13f8dced 100644 (file)
@@ -834,10 +834,18 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor
 
   if (FRAME_TERMCAP_P (XFRAME (frame)) || FRAME_MSDOS_P (XFRAME (frame)))
     {
-      if (FRAMEP (FRAME_TTY (XFRAME (frame))->top_frame))
-       /* Mark previously displayed frame as now obscured.  */
-       SET_FRAME_VISIBLE (XFRAME (FRAME_TTY (XFRAME (frame))->top_frame), 2);
-      SET_FRAME_VISIBLE (XFRAME (frame), 1);
+      Lisp_Object top_frame = FRAME_TTY (XFRAME (frame))->top_frame;
+
+      /* Don't mark the frame garbaged and/or obscured if we are
+        switching to the frame that is already the top frame of that
+        TTY.  */
+      if (!EQ (frame, top_frame))
+       {
+         if (FRAMEP (top_frame))
+           /* Mark previously displayed frame as now obscured.  */
+           SET_FRAME_VISIBLE (XFRAME (top_frame), 2);
+         SET_FRAME_VISIBLE (XFRAME (frame), 1);
+       }
       FRAME_TTY (XFRAME (frame))->top_frame = frame;
     }